﻿/**
* Скрипт управления торговыми центрами
*/
var container = Ext.getCmp(sectionId);
Ext.onReady(function () {
    var shoppingMallsGrid = {
        xtype: 'grid',
        frame: true,
        store: new Ext.data.JsonStore({
            root: 'data',
            idProperty: 'id',
            storeId: 'shoppingMallsStore',
            fields: [
                'id',
                'displayName',
                'systemName',
                'description',
                {
                    name: 'views',
                    type: 'int'
                },
                'address',
                {
                    name: 'latitude',
                    type: 'float'
                },
                {
                    name: 'longitude',
                    type: 'float'
                },
                'logoImage',
                {
                    name: 'dateCreated',
                    type: 'date'
                },
                {
                    name: 'dateModified',
                    type: 'date'
                },
                {
                    name: 'organizations',
                    type: 'int'
                },
                'city'
            ]
        }),
        height: 400,
        autoExpandColumn: 'ShoppingMallDisplayNameColumn',
        id: 'shoppingMallsGrid',
        selModel: new Ext.grid.RowSelectionModel({
            
        }),
        colModel: new Ext.grid.ColumnModel({
            columns: [
                {
                    header: 'ИД',
                    dataIndex: 'id',
                    sortable: true,
                    width: 30,
                    align: 'center',
                    id: 'ShoppingMallIdColumn'
                },
                {
                    header: 'Название',
                    dataIndex: 'displayName',
                    sortable: true,
                    width: 100,
                    align: 'left',
                    id: 'ShoppingMallDisplayNameColumn'
                },
                {
                    header: 'Системное имя',
                    dataIndex: 'systemName',
                    sortable: true,
                    width: 150,
                    align: 'left',
                    id: 'ShoppingMallSystemNameColumn'
                },
                {
                    header: 'Просмотров',
                    dataIndex: 'views',
                    sortable: true,
                    width: 100,
                    align: 'left',
                    id: 'ShoppingMallViewsColumn'
                },
                {
                    header: 'Организаций',
                    dataIndex: 'organizations',
                    sortable: true,
                    width: 100,
                    align: 'left',
                    id: 'ShoppingMallOrganizationsColumn'
                },
                {
                    header: 'Дата создания',
                    dataIndex: 'dateCreated',
                    sortable: true,
                    width: 120,
                    align: 'left',
                    id: 'ShoppingMallDateCreatedColumn'
                },
                {
                    header: 'Дата редактирования',
                    dataIndex: 'dateModified',
                    sortable: true,
                    width: 120,
                    align: 'left',
                    id: 'ShoppingMallDateModifiedColumn'
                }
            ]
        }),
        tbar: [
            {
                text: 'Обновить список',
                handler: function() {
                    reloadShoppingMalls();
                }
            },
            '-',
            {
                text: 'Добавить',
                tooltip: 'Отображает диалог добавления нового торгового центра',
                handler: function(){
                    showShoppingMallDialog();
                }
            },
            {
                text: 'Редактировать',
                tooltip: 'Отображает диалог редактирования выбранного торгового центра',
                handler: function(){
                    var selected = Ext.getCmp('shoppingMallsGrid').getSelectionModel().getSelected();
                    if (selected != null){
                        showShoppingMallDialog(selected);
                    }
                }
            },
            {
                text: 'Удалить',
                tooltip: 'Удаляет выбранный торговый центр без возврата',
                handler: function(){
                    var selectedRecord = Ext.getCmp('shoppingMallsGrid').getSelectionModel().getSelected();
                    if (selectedRecord == null){
                        return;
                    }
                    Ext.Msg.show({
                        title: 'Удаление торгового центра',
                        msg: 'Вы действительно хотите удалить выбранный торговый центр?',
                        buttons: Ext.Msg.YESNO,
                        icon: Ext.Msg.QUESTION,
                        fn: function(txt){
                            if (txt == "yes"){
                                var id = selectedRecord.data.id;
                                Ext.getCmp('shoppingMallsGrid').el.mask("Идет удаление торгового центра","x-mask-loading");
                                Ext.Ajax.request({
                                    url: '/ControlPanel/ManageShoppingMalls/Delete',
                                    params: {id: id},
                                    success: function(response,request){
                                        var data = Ext.util.JSON.decode(response.responseText);
                                        Ext.getCmp('shoppingMallsGrid').el.unmask();
                                        if (data.result == "success"){
                                            reloadShoppingMalls();
                                        } else if (data.result == "errors"){
                                            Ext.Msg.alert('Ошибка на сервере',data.message);
                                        }
                                    },
                                    failure: function(response,request){
                                        Ext.getCmp('shoppingMallsGrid').el.unmask();
                                        var data = Ext.util.JSON.decode(response.responseText);
                                        Ext.Msg.alert('Ошибка','В ходе выполнения AJAX запроса возникла ошибка: '+data.message);
                                    },
                                    method: 'POST'
                                });
                            }
                        }
                    });
                }
            },
            '-',
            {
                text: 'Геокодировать',
                tooltip: 'Геокодирует торговые центры не имеющие присвоенных GPS координат',
                handler: function(){
                    geocodeUngeocodedShoppingMalls();
                }
            }
        ],
        listeners: {
            rowdblclick: function(number,e){
                var selected = Ext.getCmp('shoppingMallsGrid').getSelectionModel().getSelected();
                if (selected != null){
                    showShoppingMallDialog(selected);
                }
            }
        }
    };

container.add(shoppingMallsGrid);
container.doLayout();

    /**
     * Отображает диалог создания или редактирования торгового центра
     * @param shoppingMall - указатель на данные с торговым центром
     */
    function showShoppingMallDialog(shoppingMall){
        var wnd = new Ext.Window({
            title: shoppingMall != undefined ? "Редактирование торгового центра "+shoppingMall.data.displayName : "Создание торгового центра",
            resizable: true,
            width: 400,
            height: 600,
            layout: 'fit',
            items: [
                {
                    xtype: 'tabpanel',
                    defferedRender: false,
                    activeTab: 0,
                    items: [
                        {
                            xtype: 'form',
                            bodyStyle: 'padding: 5px',
                            id: 'shoppingMallForm',
                            title: 'Свойства',
                            labelAlign: 'top',
                            items: [
                                {
                                    xtype: 'hidden',
                                    id: 'shoppingMallIdField',
                                    value: shoppingMall != null ? shoppingMall.data.id : -1
                                },
                                {
                                    xtype: 'textfield',
                                    anchor: '100%',
                                    allowBlank: false,
                                    fieldLabel: 'Отображаемое имя',
                                    id: 'shoppingMallDisplayNameField',
                                    value: shoppingMall != null ? shoppingMall.data.displayName : ""
                                },
                                {
                                    xtype: 'textfield',
                                    allowBlank: false,
                                    fieldLabel: 'Системное имя',
                                    id: 'shoppingMallSystemNameField',
                                    value: shoppingMall != null ? shoppingMall.data.systemName : "",
                                    anchor: '100%'
                                },
                                {
                                    xtype: 'textfield',
                                    allowBlank: false,
                                    fieldLabel: 'Город',
                                    id: 'shoppingMallCityField',
                                    value: 'Хабаровск',
                                    readonly: true,
                                    anchor: '100%'
                                },
                                {
                                    xtype: 'textarea',
                                    allowBlank: false,
                                    anchor: '100%',
                                    fieldLabel: 'Описание',
                                    id: 'shoppingMallDescriptionField',
                                    value: shoppingMall != null ? shoppingMall.data.description : "",
                                    width: 250,
                                    height: 80
                                },
                                {
                                    xtype: 'textarea',
                                    anchor: '100%',
                                    allowBlank: false,
                                    fieldLabel: 'Адрес',
                                    id: 'shoppingMallAddressField',
                                    value: shoppingMall != null ? shoppingMall.data.address : "",
                                    width: 250,
                                    height: 80
                                },
                                {
                                    xtype: 'numberfield',
                                    anchor: '100%',
                                    allowBlank: false,
                                    fieldLabel: 'Широта',
                                    id: 'shoppingMallLatitudeField',
                                    value: shoppingMall != null ? shoppingMall.data.latitude : 0
                                },
                                {
                                    xtype: 'numberfield',
                                    anchor: '100%',
                                    allowBlank: false,
                                    fieldLabel: 'Долгота',
                                    id: 'shoppingMallLongitudeField',
                                    value: shoppingMall != null ? shoppingMall.data.longitude : 0
                                },
                                {
                                    xtype: 'button',
                                    text: 'Геокодировать',
                                    tooltip: 'Получает координаты текущего торгового центра на основании введенного адреса',
                                    disabled: shoppingMall == null,
                                    handler: function(){
                                        Ext.Ajax.request({
                                            url: '/ControlPanel/ManageShoppingMalls/GeocodeAddress',
                                            params: {city: Ext.getCmp('shoppingMallCityField').getValue(), address: Ext.getCmp('shoppingMallAddressField').getValue()},
                                            success: function (response, request) {
                                                var data = Ext.util.JSON.decode(response.responseText);
                                                if (data.result == "success") {
                                                    Ext.getCmp('shoppingMallLatitudeField').setValue(data.data.latitude);
                                                    Ext.getCmp('shoppingMallLongitudeField').setValue(data.data.longitude);
                                                } else if (data.result == "errors") {
                                                    Ext.Msg.alert('Ошибка на сервере', data.message);
                                                }
                                            },
                                            failure: function (response, request) {
                                                var data = Ext.util.JSON.decode(response.responseText);
                                                Ext.Msg.alert('Ошибка', 'В ходе выполнения AJAX запроса возникла ошибка: ' + data.message);
                                            },
                                            method: 'POST'
                                        });
                                    }
                                }
                            ]
                        },
                        {
                            xtype: 'panel',
                            title: 'Фотогаллерея',
                            layout: 'fit',
                            items: [
                                {
                                    xtype: 'dataview',
                                    tpl: new Ext.XTemplate('<tpl for=".">',
                                                               '<div class="thumb-wrap" id="{name}">',
                                                               '<div class="thumb"><img src="{url}" title="{name}"></div>',
                                                               '<span class="x-editable">{shortName}</span></div>',
                                                           '</tpl>',
                                                           '<div class="x-clear"></div>'),
                                    store: new Ext.data.JsonStore({
                                        root: 'data',
                                        idProperty: 'id',
                                        fields: [
                                            'id',
                                            'name',
                                            'url',
                                            'index'
                                        ]
                                    }),
                                    id: 'shoppingMallPhotoView'
                                }
                            ],
                            id: 'shoppingMallsPhotoView',
                            tbar: [
                                {
                                    text: 'Загрузить фотографию',
                                    tooltip: 'Отображает диалог загрузки фотографии на сервер',
                                    handler: function(){

                                    }
                                },
                                {
                                    text: 'Удалить выбранные',
                                    tooltip: 'Безвозвратно удаляет выбранные фотографии с сервера',
                                    handler: function(){

                                    }
                                }
                            ],
                            listeners: {
                                activate: function(){
                                    if (shoppingMall != undefined){
                                        reloadShoppingMallsPhotos(shoppingMall.data.id);
                                    }
                                }
                            }
                        },
                        {
                            xtype: 'panel',
                            title: 'Магазины',
                            layout: 'fit',
                            items: [
                                {
                                    xtype: 'grid',
                                    id: 'shoppingMallOrganizationsGrid',
                                    store: new Ext.data.JsonStore({
                                        idProperty: 'id',
                                        root: 'data',
                                        fields: [
                                            'id',
                                            'organizationId',
                                            'displayName'
                                        ]
                                    }),
                                    sm: new Ext.grid.RowSelectionModel({
                                        multiSelect: true
                                    }),
                                    colModel: new Ext.grid.ColumnModel({
                                        columns: [
                                            {
                                                header: 'ИД организации',
                                                dataIndex: 'organizationId',
                                                sortable: true,
                                                width: 150,
                                                align: 'left',
                                                id: 'ShoppingMallOrganizationIdColumn'
                                            },
                                            {
                                                header: 'Название организации',
                                                dataIndex: 'displayName',
                                                sortable: true,
                                                width: 150,
                                                align: 'left',
                                                id: 'ShoppingMallOrganizationDisplayNameColumn'
                                            }
                                        ]
                                    }),
                                    autoExpandColumn: 'ShoppingMallOrganizationDisplayNameColumn',
                                    tbar: [
                                        {
                                            text: 'Добавить организацию',
                                            tooltip: 'Отображает диалог добавления организации к торговому центру',
                                            handler: function(){

                                            }
                                        },
                                        {
                                            text: 'Удалить выбранные',
                                            tooltip: 'Удаляет выбранные организации из текущего торгового центра',
                                            handler: function(){

                                            }
                                        }
                                    ]
                                }
                            ],
                            listeners: {
                                activate: function(){
                                    if (shoppingMall != undefined){
                                        reloadShoppingMallsOrganizations(shoppingMall.data.id);
                                    }
                                }
                            }
                        }
                    ]
                }
            ],
            buttons: [
                {
                    text: 'Сохранить',
                    tooltip: 'Сохраняет изменения',
                    handler: function(){
                        // Валидация формы
                        if (!Ext.getCmp('shoppingMallForm').getForm().isValid()){
                            Ext.Msg.alert('Ошибка заполнение формы','Пожалуйста, правильно заполните форму');
                            return;
                        }

                        // подготавливаем данные
                        var params = {
                            id: Ext.getCmp('shoppingMallIdField').getValue(),
                            displayName: Ext.getCmp('shoppingMallDisplayNameField').getValue(),
                            systemName: Ext.getCmp('shoppingMallSystemNameField').getValue(),
                            description: Ext.getCmp('shoppingMallDescriptionField').getValue(),
                            address: Ext.getCmp('shoppingMallAddressField').getValue(),
                            city: Ext.getCmp('shoppingMallCityField').getValue(),
                            latitude: Ext.getCmp('shoppingMallLatitudeField').getValue(),
                            longitude: Ext.getCmp('shoppingMallLongitudeField').getValue()
                        }

                        // Отправляем данные
                        Ext.getCmp('shoppingMallsGrid').el.mask("Идет загрузка списка торговых центров","x-mask-loading");
                        Ext.Ajax.request({
                            url: '/ControlPanel/ManageShoppingMalls/Save',
                            params: params,
                            success: function (response, request) {
                                var data = Ext.util.JSON.decode(response.responseText);
                                Ext.getCmp('shoppingMallsGrid').el.unmask();
                                if (data.result == "success") {
                                    wnd.close();
                                    reloadShoppingMalls();
                                } else if (data.result == "errors") {
                                    Ext.Msg.alert('Ошибка на сервере', data.message);
                                }
                            },
                            failure: function (response, request) {
                                Ext.getCmp('shoppingMallsGrid').el.unmask();
                                var data = Ext.util.JSON.decode(response.responseText);
                                Ext.Msg.alert('Ошибка', 'В ходе выполнения AJAX запроса возникла ошибка: ' + data.message);
                            },
                            method: 'POST'
                        });
                    }
                },
                {
                    text: 'Закрыть',
                    handler: function(){
                        wnd.close();
                    }
                }
            ],
            listeners: {

            }

        });
        wnd.show();
    }

    /**
     * Перезагружает все имеющиеся торговые центры с сервера
     */
    function reloadShoppingMalls(){
        Ext.getCmp('shoppingMallsGrid').el.mask("Идет загрузка списка торговых центров","x-mask-loading");
        Ext.Ajax.request({
            url: '/ControlPanel/ManageShoppingMalls/GetShoppingMalls',
            params: {},
            success: function (response, request) {
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.getCmp('shoppingMallsGrid').el.unmask();
                if (data.result == "success") {
                    Ext.getCmp('shoppingMallsGrid').getStore().loadData(data);
                } else if (data.result == "errors") {
                    Ext.Msg.alert('Ошибка на сервере', data.message);
                }
            },
            failure: function (response, request) {
                Ext.getCmp('shoppingMallsGrid').el.unmask();
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.Msg.alert('Ошибка', 'В ходе выполнения AJAX запроса возникла ошибка: ' + data.message);
            },
            method: 'POST'
        });
    }
    reloadShoppingMalls();

    /**
     * Перезагружает список организаций, проассоциированных с указанным торговым центром
     * @param shoppingMallId - идентификатор торгового центра
     */
    function reloadShoppingMallsOrganizations(shoppingMallId){
        if (shoppingMallId == undefined || shoppingMallId < 0){
            return;
        }
        Ext.getCmp('shoppingMallOrganizationsGrid').el.mask("Идет загрузка списка организаций","x-mask-loading");
        Ext.Ajax.request({
            url: '/ControlPanel/ManageShoppingMalls/GetShoppingMallOrganizations',
            params: {id: shoppingMallId},
            success: function (response, request) {
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.getCmp('shoppingMallOrganizationsGrid').el.unmask();
                if (data.result == "success") {
                    Ext.getCmp('shoppingMallOrganizationsGrid').getStore().loadData(data);
                } else if (data.result == "errors") {
                    Ext.Msg.alert('Ошибка на сервере', data.message);
                }
            },
            failure: function (response, request) {
                Ext.getCmp('shoppingMallOrganizationsGrid').el.unmask();
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.Msg.alert('Ошибка', 'В ходе выполнения AJAX запроса возникла ошибка: ' + data.message);
            },
            method: 'POST'
        });
    }

    /**
     * Перезагружает список фотографий для указанного торгового центра
     * @param shoppingMallId - идентификатор торгового центра
     */
    function reloadShoppingMallsPhotos(shoppingMallId){
        if (shoppingMallId == undefined || shoppingMallId < 0){
            return;
        }
        Ext.getCmp('shoppingMallPhotoView').el.mask("Идет загрузка списка фотографий","x-mask-loading");
        Ext.Ajax.request({
            url: '/ControlPanel/ManageShoppingMalls/GetShoppingMallPhotos',
            params: {id: shoppingMallId},
            success: function (response, request) {
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.getCmp('shoppingMallPhotoView').el.unmask();
                if (data.result == "success") {
                    Ext.getCmp('shoppingMallPhotoView').getStore().loadData(data);
                } else if (data.result == "errors") {
                    Ext.Msg.alert('Ошибка на сервере', data.message);
                }
            },
            failure: function (response, request) {
                Ext.getCmp('shoppingMallPhotoView').el.unmask();
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.Msg.alert('Ошибка', 'В ходе выполнения AJAX запроса возникла ошибка: ' + data.message);
            },
            method: 'POST'
        });
    }

    /**
     * Запускает геокодирование, которое находит и присваивает координаты всем торговым центрам, у которых этих координат не установлено
     */
    function geocodeUngeocodedShoppingMalls(){
        Ext.getCmp('shoppingMallsGrid').el.mask("Идет геокодирование списка торговых центров","x-mask-loading");
        Ext.Ajax.request({
            url: '/ControlPanel/ManageShoppingMalls/GeocodeShoppingMalls',
            params: {},
            success: function (response, request) {
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.getCmp('shoppingMallsGrid').el.unmask();
                if (data.result == "success") {
                    Ext.Msg.alert('Геокодирование завершено','Успешно геокодировано '+data.data.geocoded+" из "+data.data.total+" торговых центров без установленных координат");
                } else if (data.result == "errors") {
                    Ext.Msg.alert('Ошибка на сервере', data.message);
                }
            },
            failure: function (response, request) {
                Ext.getCmp('shoppingMallsGrid').el.unmask();
                var data = Ext.util.JSON.decode(response.responseText);
                Ext.Msg.alert('Ошибка', 'В ходе выполнения AJAX запроса возникла ошибка: ' + data.message);
            },
            method: 'POST'
        });
    }

});